Events_Interface.py

Turn on Frame Grabber and Receive Event(s)

It shows how to turn on the frame grabber and receive one or more events.

1 # -- coding: utf-8 --
2 
3 import sys
4 import platform
5 import os
6 from ctypes import *
7 
8 # Compatible with different operating systems to load DDL
9 currentsystem = platform.system()
10 if currentsystem == 'Windows':
11  sys.path.append(os.path.join(os.getenv('MVCAM_COMMON_RUNENV'), "Samples", "Python", "MvImport"))
12 else:
13  sys.path.append(os.path.join("..", "..", "MvImport"))
14 
15 from MvCameraControl_class import *
16 
17 
18 # Compatible with input processing of Python 2.X and 3.X
19 if sys.version_info[0] < 3:
20  # Python 2.x
21  input_func = raw_input
22 else:
23  # Python 3.x
24  input_func = input
25 
26 # Decoding Characters
27 def decoding_char(ctypes_char_array):
28  """
29  Safely decode a string from a ctypes character array.
30  Compatible with Python 2.x and 3.x, as well as 32-bit and 64-bit environments.
31  """
32  byte_str = memoryview(ctypes_char_array).tobytes()
33 
34  # Truncate at the first null character
35  null_index = byte_str.find(b'\x00')
36  if null_index != -1:
37  byte_str = byte_str[:null_index]
38 
39  # Attempt to decode using multiple encodings
40  for encoding in ['gbk', 'utf-8', 'latin-1']:
41  try:
42  return byte_str.decode(encoding)
43  except UnicodeDecodeError:
44  continue
45 
46  # If all encodings fail, use a replacement strategy
47  return byte_str.decode('latin-1', errors='replace')
48 
49 fun_ctype = get_platform_functype()
50 
51 # Event callback function
52 stEventInfo = POINTER(MV_EVENT_OUT_INFO)
53 EventInfoCallBack = fun_ctype(None, stEventInfo, c_void_p)
54 
55 def event_callback(pEventInfo, pUser):
56  stPEventInfo = cast(pEventInfo, POINTER(MV_EVENT_OUT_INFO)).contents
57  nBlockId = stPEventInfo.nBlockIdHigh
58  nBlockId = (nBlockId << 32) + stPEventInfo.nBlockIdLow
59  nTimestamp = stPEventInfo.nTimestampHigh
60  nTimestamp = (nTimestamp << 32) + stPEventInfo.nTimestampLow
61  if stPEventInfo:
62  print("EventName[%s], EventId[%u], BlockId[%d], Timestamp[%d]" % (stPEventInfo.EventName.decode('UTF-8'),
63  stPEventInfo.nEventID, nBlockId, nTimestamp))
64 EVENT_CALL_BACK_FUN = EventInfoCallBack(event_callback)
65 
66 
67 # Image callback function
68 stFrameInfo = POINTER(MV_FRAME_OUT_INFO_EX)
69 pData = POINTER(c_ubyte)
70 FrameInfoCallBack = fun_ctype(None, pData, stFrameInfo, c_void_p)
71 
72 def image_callback(pData, pFrameInfo, pUser):
73  stFrameInfo = cast(pFrameInfo, POINTER(MV_FRAME_OUT_INFO_EX)).contents
74  if stFrameInfo:
75  # print("get one frame: Width[%d], Height[%d], nFrameNum[%d]"
76  # % (stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nFrameNum))
77  pass
78 IMAGE_CALL_BACK_FUN = FrameInfoCallBack(image_callback)
79 
80 
81 def print_interface_info(interfaceList):
82  for i in range(0, interfaceList.nInterfaceNum):
83  interfaceInfo = cast(interfaceList.pInterfaceInfos[i], POINTER(MV_INTERFACE_INFO)).contents
84  print("interface: [%d]" % i)
85  displayName = decoding_char(interfaceInfo.chDisplayName)
86  print("display name: %s" % displayName)
87 
88  serialNumber = decoding_char(interfaceInfo.chSerialNumber)
89  print("serial number: %s" % serialNumber)
90 
91  modelName = decoding_char(interfaceInfo.chModelName)
92  print("model name: %s" % modelName)
93 
94  interfaceId = decoding_char(interfaceInfo.chInterfaceID)
95  print("interface id: %s" % interfaceId)
96 
97 def print_devices_info(deviceList):
98  for i in range(0, deviceList.nDeviceNum):
99  mvcc_dev_info = cast(deviceList.pDeviceInfo[i], POINTER(MV_CC_DEVICE_INFO)).contents
100  if mvcc_dev_info.nTLayerType == MV_GIGE_DEVICE or mvcc_dev_info.nTLayerType == MV_GENTL_GIGE_DEVICE:
101  print ("\ngige device: [%d]" % i)
102  strModeName = decoding_char(mvcc_dev_info.SpecialInfo.stGigEInfo.chModelName)
103  print ("device model name: %s" % strModeName)
104 
105  nip1 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24)
106  nip2 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16)
107  nip3 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8)
108  nip4 = (mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff)
109  print ("current ip: %d.%d.%d.%d\n" % (nip1, nip2, nip3, nip4))
110  elif mvcc_dev_info.nTLayerType == MV_USB_DEVICE:
111  print ("\nu3v device: [%d]" % i)
112  strModeName = decoding_char(mvcc_dev_info.SpecialInfo.stUsb3VInfo.chModelName)
113  print ("device model name: %s" % strModeName)
114 
115  strSerialNumber = decoding_char(mvcc_dev_info.SpecialInfo.stUsb3VInfo.chSerialNumber)
116  print ("user serial number: %s" % strSerialNumber)
117  elif mvcc_dev_info.nTLayerType == MV_GENTL_CAMERALINK_DEVICE:
118  print ("\nCML device: [%d]" % i)
119  strModeName = decoding_char(mvcc_dev_info.SpecialInfo.stCMLInfo.chModelName)
120  print ("device model name: %s" % strModeName)
121 
122  strSerialNumber = decoding_char(mvcc_dev_info.SpecialInfo.stCMLInfo.chSerialNumber)
123  print ("user serial number: %s" % strSerialNumber)
124  elif mvcc_dev_info.nTLayerType == MV_GENTL_CXP_DEVICE:
125  print ("\nCXP device: [%d]" % i)
126  strModeName = decoding_char(mvcc_dev_info.SpecialInfo.stCXPInfo.chModelName)
127  print ("device model name: %s" % strModeName)
128 
129  strSerialNumber = decoding_char(mvcc_dev_info.SpecialInfo.stCXPInfo.chSerialNumber)
130  print ("user serial number: %s" % strSerialNumber)
131  elif mvcc_dev_info.nTLayerType == MV_GENTL_XOF_DEVICE:
132  print ("\nXoF device: [%d]" % i)
133  strModeName = decoding_char(mvcc_dev_info.SpecialInfo.stXoFInfo.chModelName)
134  print ("device model name: %s" % strModeName)
135 
136  strSerialNumber = decoding_char(mvcc_dev_info.SpecialInfo.stXoFInfo.chSerialNumber)
137  print ("user serial number: %s" % strSerialNumber)
138 
139 
140 if __name__ == "__main__":
141 
142  try:
143  # Initialize SDK resources
144  MvCamera.MV_CC_Initialize()
145 
146  SDKVersion = MvCamera.MV_CC_GetSDKVersion()
147  print ("SDKVersion[0x%x]" % SDKVersion)
148 
149  interfaceList = MV_INTERFACE_INFO_LIST()
150  transportLayerType = MV_GIGE_INTERFACE | MV_CAMERALINK_INTERFACE | MV_CXP_INTERFACE | MV_XOF_INTERFACE
151 
152  # Enumerate frame grabbers
153  ret = MvCamera.MV_CC_EnumInterfaces(transportLayerType, interfaceList)
154  if ret != 0:
155  print("enum interfaces fail! ret[0x%x]" % ret)
156  sys.exit()
157 
158  if interfaceList.nInterfaceNum == 0:
159  print("find no interface!")
160  sys.exit()
161 
162  print("Find %d interfaces!" % interfaceList.nInterfaceNum)
163  print_interface_info(interfaceList)
164 
165  nInterfaceIndex = input_func("please input the number of the interface to connect:")
166 
167  if int(nInterfaceIndex) >= interfaceList.nInterfaceNum:
168  print("input error!")
169  sys.exit()
170 
171  # Create a camera instance
172  cam_instance = MvCamera()
173  interface_instance = MvCamera()
174 
175  # Select the frame grabber, and create a handle
176  curInterface = cast(interfaceList.pInterfaceInfos[int(nInterfaceIndex)], POINTER(MV_INTERFACE_INFO)).contents
177 
178  ret = interface_instance.MV_CC_CreateInterface(curInterface)
179  if ret != 0:
180  raise Exception("create interface handle fail! ret[0x%x]" % ret)
181 
182  # Turn on the frame grabber
183  ret = interface_instance.MV_CC_OpenInterface()
184  if ret != 0:
185  raise Exception("open interface fail! ret[0x%x]" % ret)
186  else:
187  print("open interface success")
188 
189  # Enable the ReceiveImageFrameStart0 event of frame grabber
190  ret = interface_instance.MV_CC_EventNotificationOn("ReceiveImageFrameStart0")
191  if ret != 0:
192  raise Exception("Set interface event notification on fail! ret[0x%x]" % ret)
193 
194  # Register an event callback of frame grabber
195  ret = interface_instance.MV_CC_RegisterEventCallBackEx("ReceiveImageFrameStart0", EVENT_CALL_BACK_FUN, None)
196  if ret != 0:
197  raise Exception("register event callback fail! ret [0x%x]" % ret)
198 
199  # Enumerates cameras connected to the frame grabber
200  deviceList = MV_CC_DEVICE_INFO_LIST()
201  ret = interface_instance.MV_CC_EnumDevicesByInterface(deviceList)
202  if ret != 0:
203  raise Exception("enum devices fail! ret[0x%x]" % ret)
204 
205  if deviceList.nDeviceNum == 0:
206  raise Exception("find no device!")
207 
208  print_devices_info(deviceList)
209 
210  nCamIndex = input_func("please input the number of the device to connect:")
211 
212  if int(nCamIndex) >= deviceList.nDeviceNum:
213  raise Exception("input error!")
214 
215  # Select device 0, and create a handle
216  stDeviceList = cast(deviceList.pDeviceInfo[int(nCamIndex)], POINTER(MV_CC_DEVICE_INFO)).contents
217 
218  ret = cam_instance.MV_CC_CreateHandle(stDeviceList)
219  if ret != 0:
220  raise Exception("create handle fail! ret[0x%x]" % ret)
221 
222  # Turn on the device
223  ret = cam_instance.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
224  if ret != 0:
225  raise Exception("open device fail! ret[0x%x]" % ret)
226 
227  # Get optimal packet size (only supported by GigE devices)
228  if stDeviceList.nTLayerType == MV_GIGE_DEVICE or stDeviceList.nTLayerType == MV_GENTL_GIGE_DEVICE:
229  nPacketSize = cam_instance.MV_CC_GetOptimalPacketSize()
230  if int(nPacketSize) > 0:
231  ret = cam_instance.MV_CC_SetIntValue("GevSCPSPacketSize", nPacketSize)
232  if ret != 0:
233  print("Warning: Set Packet Size fail! ret[0x%x]" % ret)
234  else:
235  print("Warning: Get Packet Size fail! ret[0x%x]" % nPacketSize)
236 
237  #Register an image grabbing callback
238  ret = cam_instance.MV_CC_RegisterImageCallBackEx(IMAGE_CALL_BACK_FUN, None)
239  if ret != 0:
240  raise Exception("register image callback fail! ret[0x%x]" % ret)
241 
242  # Start grabbing images
243  ret = cam_instance.MV_CC_StartGrabbing()
244  if ret != 0:
245  raise Exception("start grabbing fail! ret[0x%x]" % ret)
246 
247  print ("press Enter key to stop grabbing.")
248  input_func()
249 
250  # Stop grabbing images
251  ret = cam_instance.MV_CC_StopGrabbing()
252  if ret != 0:
253  raise Exception("stop grabbing fail! ret[0x%x]" % ret)
254 
255  # Turn off the device
256  ret = cam_instance.MV_CC_CloseDevice()
257  if ret != 0:
258  raise Exception("close deivce fail! ret[0x%x]" % ret)
259 
260  # Destroy the handle
261  cam_instance.MV_CC_DestroyHandle()
262 
263  # Turn off the frame grabber
264  interface_instance.MV_CC_CloseInterface()
265 
266  # Destroy frame grabber handle
267  interface_instance.MV_CC_DestroyInterface()
268  except Exception as e:
269  print(e)
270  cam_instance.MV_CC_CloseDevice()
271  cam_instance.MV_CC_DestroyHandle()
272  interface_instance.MV_CC_CloseInterface()
273  interface_instance.MV_CC_DestroyInterface()
274 
275  finally:
276  # Release SDK resources
277  MvCamera.MV_CC_Finalize()